package br.com.cefetrn.apoena.view.action;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.sun.org.apache.xalan.internal.xsltc.compiler.sym;

import sun.awt.HorizBagLayout;

import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoProfissional;
import br.com.cefetrn.apoena.dominio.entity.AreasAtuacaoPublicoAlvo;
import br.com.cefetrn.apoena.dominio.entity.AreasDeAtuacao;
import br.com.cefetrn.apoena.dominio.entity.Endereco;
import br.com.cefetrn.apoena.dominio.entity.Profissional;
import br.com.cefetrn.apoena.dominio.home.Home4AreasAtuacaoPublicoAlvo;
import br.com.cefetrn.apoena.dominio.home.Home4AreasDeAtuacao;
import br.com.cefetrn.apoena.dominio.home.Home4Profissional;

public class Action4Profissional extends AxActionAPOENA {

	private static final long serialVersionUID = -933215399562127384L;

	private static final Log LOG = LogFactory.getLog(Action4Profissional.class);

	private final Home4Profissional homeProfissional = new Home4Profissional();

	private final Home4AreasDeAtuacao homeAreasDeAtuacao = new Home4AreasDeAtuacao();

	private final Home4AreasAtuacaoPublicoAlvo homeAreasAtuacaoPublicoAlvo = new Home4AreasAtuacaoPublicoAlvo();

	private Profissional profissional = new Profissional();

	private List<Profissional> profissionais = new ArrayList<Profissional>();

	private List<String> unidadesFederativas = Endereco.UNIDADES_FEDERATIVAS;

	// OUTPUT DO FORMULÁRIO
	private List<AreasDeAtuacao> areasDeAtuacao = new ArrayList<AreasDeAtuacao>();

	// INPUT DO FORMULÁRIO
	private List<String> strAreas = new ArrayList<String>();

	private List<String> strAreasPublico = new ArrayList<String>();

	private int codAreaAtuacaoBuscada = new Integer(0);
	
	private static final String CADASTRO_VER = "ver";
	private static final String CADASTRO_EDITAR = "editar";
	private static final String CADASTRO_INSERIR = "inserir";
	
	private String cadastro = CADASTRO_VER;

	@Override
	public void prepare() throws Exception {

		super.prepare();

		homeProfissional.setSession(getSession());
		homeAreasDeAtuacao.setSession(getSession());
		homeAreasAtuacaoPublicoAlvo.setSession(getSession());

		areasDeAtuacao = homeAreasDeAtuacao.findAll();
	}

	@Override
	protected String go() {

		LOG.info("Starting go()");
		LOG.info("Tipo: " + tipo);

		switchAcao: {

			if (CADASTRO.equalsIgnoreCase(tipo)) {
				controllCadastro();
				break switchAcao;
			}

			if (BUSCA.equalsIgnoreCase(tipo)) {
				buscar();
				break switchAcao;
			}
			
			if (EDICAO.equalsIgnoreCase(tipo)) {
				controllCadastro();
				break switchAcao;
			}
			
			if (REMOCAO.equalsIgnoreCase(tipo)) {
				remover();
				break switchAcao;
			}
		}

		return result;
	}

	private void controllCadastro(){
		
		if(profissional.getId() == null || profissional.getId() == 0){
			cadastro = CADASTRO_INSERIR;
			cadastrar();
		}else{
			if(cadastro.equalsIgnoreCase(CADASTRO_EDITAR)){
				editar();
			}
		}
	}
	
	private void cadastrar() {

		if (botao.equalsIgnoreCase("ENVIAR")) {

			profissional.setLogin(criaLogin());

			loadAreasDeAtuacaoProfissional();

			profissional = homeProfissional.persist(profissional);

			addActionMessage("CADASTRO REALIZADO COM SUCESSO!");

			cadastro = CADASTRO_VER;

			result = SUCCESS;
		}
	}

	private void buscar() {

		if (botao.equalsIgnoreCase("BUSCAR")) {

			AreasDeAtuacao a = null;

			if (codAreaAtuacaoBuscada != 0) {

				a = homeAreasDeAtuacao.findById(codAreaAtuacaoBuscada);

			}

			profissionais = homeProfissional.findProfissionais(null, a,
					profissional.getEndereco().getCidade());

			result = SUCCESS;
		}

	}

	private void editar() {
	
		if(profissional.getId() != null && profissional.getId() > 0){
				
				if(EDICAO.equalsIgnoreCase(tipo)){
					
					loadAreasDeAtuacaoProfissional();
				
					homeProfissional.attachDirty(profissional);
					
					tipo = CADASTRO;
					cadastro = CADASTRO_VER;
					
				}else{
					
					profissional = homeProfissional.findById(profissional.getId());
				}
		}		
	}

	private void remover() {

	}

	private void loadAreasDeAtuacaoProfissional() {

		Set<AreasAtuacaoProfissional> areas = new HashSet<AreasAtuacaoProfissional>();

		for (AreasAtuacaoPublicoAlvo areaPublico : loadAreasAtuacaoPublicoAlvo())
			areas.add(new AreasAtuacaoProfissional(areaPublico
					.getAreasDeAtuacao(), areaPublico.getPublicoAlvo(),
					profissional));

		profissional.setAreasAtuacaoProfissionals(areas);

	}

	private List<AreasAtuacaoPublicoAlvo> loadAreasAtuacaoPublicoAlvo() {

		List<AreasAtuacaoPublicoAlvo> areasPublico = new ArrayList<AreasAtuacaoPublicoAlvo>();

		if (strAreasPublico != null && !strAreasPublico.isEmpty()) {

			for (String id : strAreasPublico) {
				areasPublico.add(homeAreasAtuacaoPublicoAlvo
						.findById(new Integer(id)));
			}

		}
		
		return areasPublico;
	}

	private List<AreasDeAtuacao> loadAreasDeAtuacao() {

		List<AreasDeAtuacao> areas = new ArrayList<AreasDeAtuacao>();

		if (strAreas != null && !strAreas.isEmpty()) {

			for (String id : strAreas) {
				areas.add(homeAreasDeAtuacao.findById(new Integer(id)));
			}
		}

		return areas;
	}

	public Profissional getProfissional() {
		return profissional;
	}

	public void setProfissional(Profissional profissional) {
		this.profissional = profissional;
	}

	public List<String> getUnidadesFederativas() {
		return unidadesFederativas;
	}

	public void setUnidadesFederativas(List<String> unidadesFederativas) {
		this.unidadesFederativas = unidadesFederativas;
	}

	public List<Profissional> getProfissionais() {
		return profissionais;
	}

	public void setProfissionais(List<Profissional> profissionais) {
		this.profissionais = profissionais;
	}

	public List<AreasDeAtuacao> getAreasDeAtuacao() {
		return areasDeAtuacao;
	}

	public void setAreasDeAtuacao(List<AreasDeAtuacao> areasDeAtuacao) {
		this.areasDeAtuacao = areasDeAtuacao;
	}

	public List<String> getStrAreas() {
		return strAreas;
	}

	public void setStrAreas(List<String> strAreas) {
		this.strAreas = strAreas;
	}

	public List<String> getStrAreasPublico() {
		return strAreasPublico;
	}

	public void setStrAreasPublico(List<String> strAreasPublico) {
		this.strAreasPublico = strAreasPublico;
	}

	public int getCodAreaAtuacaoBuscada() {
		return codAreaAtuacaoBuscada;
	}

	public void setCodAreaAtuacaoBuscada(int codAreaAtuacaoBuscada) {
		this.codAreaAtuacaoBuscada = codAreaAtuacaoBuscada;
	}

	public String getCadastro() {
		return cadastro;
	}

	public void setCadastro(String cadastro) {
		this.cadastro = cadastro;
	}
		
}
